package com.example.ercmssystem2.repository;

import com.example.ercmssystem2.entity.EventResponse;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;

@Repository
public interface EventResponseRepository extends JpaRepository<EventResponse, Long> {

    // 根据事件ID查询响应记录
    List<EventResponse> findByEventId(Long eventId);

    // 根据响应人查询响应记录
    List<EventResponse> findByResponderId(Long responderId);

    // 根据响应类型查询
    List<EventResponse> findByResponseType(String responseType);

    // 根据状态查询
    List<EventResponse> findByStatus(String status);

    // 查询事件的第一响应记录
    @Query("SELECT er FROM EventResponse er WHERE er.event.id = :eventId AND er.responseType = 'FIRST_RESPONSE' ORDER BY er.responseTime ASC")
    List<EventResponse> findFirstResponseByEventId(@Param("eventId") Long eventId);

    // 查询事件的所有响应记录（按时间排序）
    @Query("SELECT er FROM EventResponse er WHERE er.event.id = :eventId ORDER BY er.responseTime ASC")
    List<EventResponse> findAllResponsesByEventIdOrderByTime(@Param("eventId") Long eventId);

    // 根据时间范围查询响应记录
    List<EventResponse> findByResponseTimeBetween(LocalDateTime startTime, LocalDateTime endTime);

    // 查询超时的响应记录（基于响应时间）
    @Query("SELECT er FROM EventResponse er WHERE er.responseTime < :timeout AND er.status = 'PENDING'")
    List<EventResponse> findTimeoutResponses(@Param("timeout") LocalDateTime timeout);

    // 统计响应人的响应次数
    @Query("SELECT er.responder.id, COUNT(er) FROM EventResponse er GROUP BY er.responder.id")
    List<Object[]> countByResponder();

    // 统计各类型响应数量
    @Query("SELECT er.responseType, COUNT(er) FROM EventResponse er GROUP BY er.responseType")
    List<Object[]> countByResponseType();

    // 查询平均响应时间（基于响应时间到更新时间）
    @Query("SELECT AVG(TIMESTAMPDIFF(MINUTE, er.responseTime, er.updatedAt)) FROM EventResponse er WHERE er.updatedAt IS NOT NULL")
    Double getAverageResponseDuration();

    // 根据事件ID查询响应记录（按时间倒序）
    List<EventResponse> findByEventIdOrderByResponseTimeDesc(Long eventId);

    // 根据事件ID查询响应记录（按时间正序）
    List<EventResponse> findByEventIdOrderByResponseTimeAsc(Long eventId);

    // 根据事件ID和响应类型查询响应记录（按时间倒序）
    List<EventResponse> findByEventIdAndResponseTypeOrderByResponseTimeDesc(Long eventId, String responseType);
} 